#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 控件初始化
    Widget_Init();

    // 创建信息修改实例
    photo = new PhotoShow;
}

/**
 * @brief 控件初始化
 */
void MainWindow::Widget_Init(void)
{
    //去掉标题栏
    this->setWindowFlags(Qt::FramelessWindowHint);

    // 设置窗口样式
    setWindowIcon(QIcon("://images/frog.png"));
    setWindowTitle(QString("呱唧呱唧"));

    // 定义最小化和返回按键
    connect(ui->btnWinClose, &QPushButton::clicked,   this, [=](){ this->close(); });
    connect(ui->btnWinMin, &QPushButton::clicked,     this, [=](){ this->showMinimized(); });

    // 获取可用串口
    serial = new QSerialPort;
    QStringList serialPortName;
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        serialPortName << info.portName();
    }
    serial->setPortName(serialPortName[0]);
    serial->open(QIODevice::ReadWrite);
    serial->setBaudRate(QSerialPort::Baud115200);       //设置波特率为115200
    serial->setDataBits(QSerialPort::Data8);            //设置数据位8
    serial->setParity(QSerialPort::NoParity);           //校验位设置为0
    serial->setStopBits(QSerialPort::OneStop);          //停止位设置为1
    serial->setFlowControl(QSerialPort::NoFlowControl); //设置为无流控制

    // 串口连接槽函数
    QObject::connect(serial,&QSerialPort::readyRead,this,[=]()
    {
        // 读取串口数据
        QByteArray buffer = serial->readAll();
        char *m=buffer.data();

        // 解包
        Point p;
        memcpy(&p, m, sizeof (p));

        if(p.x == 0xFFFF)
        {
            switch(p.y)
            {
                case 0xEEEE: valid_points.clear(); break;
                default: Update_Notes(p.y);
            }
        }
        else
        {
            valid_points.push_back(p);
        }
    });

    // 便利贴显示框

    QListWidget * list[3] = {ui->NoteBlue, ui->NoteGreen, ui->NoteYellow};
    QListWidget * l;
    for(int i = 0; i < 3; i ++)
    {
        // 配置每个便利贴块
        l = list[i];

        //设置显示模式
        l->setViewMode(QListView::IconMode);

        //设置单元项的图片大小
        l->setIconSize(QSize(200,150));

        //设置QListWidget中单元项的间距
        l->setSpacing(10);

        //设置自动适应布局调整（Adjust适应，Fixed不适应），默认不适应
        l->setResizeMode(QListWidget::Adjust);

        //设置不能移动
        l->setMovement(QListWidget::Static);

        //连接槽函数
        connect(l,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(ImgClicked(QListWidgetItem*)));
    }
    for (int i = 0; i < 10; i++)
    {
        QListWidgetItem *imageItem = new QListWidgetItem;
        imageItem->setIcon(QIcon(QPixmap("://images/frog.png").scaled(200,150)));
        ui->NoteBlue->addItem(imageItem);
    }

    // 清除按键
    connect(ui->BtnClean, &QPushButton::clicked, this,[=](){
        Clean_Notes();
    });
}

/**
 * @brief 清除便利贴
 */
void MainWindow::Clean_Notes(void)
{
    ui->NoteBlue->clear();
    ui->NoteGreen->clear();
    ui->NoteYellow->clear();
}

/**
 * @brief 更新便利贴
 * @param color 要添加的便利贴颜色
 */
void MainWindow::Update_Notes(int color)
{
    // 清空图像内存
    for(int i = 0; i < PHOTO_WIDTH; i ++)
    {
        for(int j = 0; j < PHOTO_HEIGTH; j ++)
        {
            img_data[i][j] = 0;
        }
    }

    // 图片转化
    while (!valid_points.empty()) {
        img_data[valid_points.back().x][valid_points.back().y] = 255;
        valid_points.pop_back();
    }
    QImage img = Pk8bitGrayToQIm((uint8_t*)img_data, PHOTO_WIDTH, PHOTO_HEIGTH);
    QListWidgetItem *imageItem = new QListWidgetItem;
    QPixmap pix = QPixmap::fromImage(img);
    imageItem->setIcon(QIcon(pix.scaled(200,150)));

    // 选择便利贴列表
    QListWidget * list;
    switch (color) {
        case 1 : list = ui->NoteBlue; break;
        case 2 : list = ui->NoteGreen; break;
        case 3 : list = ui->NoteYellow; break;
    }
    list->addItem(imageItem);
}


/**
 * @brief 点击图片
 */
void MainWindow::ImgClicked(QListWidgetItem* item)
{
    // 显示大图
    photo->ShowImg(item->icon());
}

/**
 * @brief Pk8bitGrayToQIm
 * @param pBuffer   数组指针
 * @param bufWidth  图像宽度
 * @param bufHight  图像高度
 * @return
 */
QImage MainWindow::Pk8bitGrayToQIm(const unsigned char *pBuffer, const int &bufWidth, const int &bufHight)
{

    //对参数的有效性进行检查
    assert((pBuffer != NULL) && (bufWidth > 0) && (bufHight > 0));

    int biBitCount = 8; //灰度图像像素bit数
    int lineByte = (bufWidth * biBitCount / 8 + 3) / 4 * 4; //bmp行byte数（格式宽度，为4的倍数）

    if (bufWidth == lineByte) //判断图像宽度与格式宽度
    {
        QImage qIm = QImage(pBuffer, bufWidth, bufHight, QImage::Format_Indexed8);  //封装QImage
        qIm.setColorTable(vcolorTable); //设置颜色表
        return qIm;
    }
    else
    {
        QImage qImage = QImage(pBuffer, bufWidth, bufHight, bufWidth, QImage::Format_Indexed8);  //封装QImage
        qImage.setColorTable(vcolorTable); //设置颜色表
        return qImage;
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

// 重定义鼠标移动函数
void MainWindow::mousePressEvent(QMouseEvent *e)
{
    last=e->globalPos();
}
void MainWindow::mouseMoveEvent(QMouseEvent *e)
{
    int dx = e->globalX() - last.x();
        int dy = e->globalY() - last.y();
        last = e->globalPos();
        move(x()+dx, y()+dy);
}
void MainWindow::mouseReleaseEvent(QMouseEvent *e)
{
    int dx = e->globalX() - last.x();
    int dy = e->globalY() - last.y();
    move(x()+dx, y()+dy);
}

